home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / mm / mm-0.90 / browse.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-12-18  |  5.8 KB  |  283 lines

  1. /*
  2.  * Copyright (c) 1986, 1990 by The Trustees of Columbia University in
  3.  * the City of New York.  Permission is granted to any individual or
  4.  * institution to use, copy, or redistribute this software so long as it
  5.  * is not sold for profit, provided this copyright notice is retained.
  6.  */
  7.  
  8. #ifndef lint
  9. static char *rcsid = "$Header: /f/src2/encore.bin/cucca/mm/tarring-it-up/RCS/browse.c,v 2.1 90/10/04 18:23:34 melissa Exp $";
  10. #endif
  11.  
  12. #include "mm.h"
  13. #include "parse.h"
  14. #include "cmds.h"
  15.  
  16. int browse_body(), browse_header(), browse_next(), browse_prev(),
  17.     browse_quit(), browse_switch(), browse_help(), browse_copy(), 
  18.     browse_reply(), browse_delete(), browse_flag(), browse_keyword();
  19.  
  20. extern int browse_pause, browse_clear_screen;
  21.  
  22. #define B_FORWARD 1
  23. #define B_BACKWARD 2
  24. #define B_STAY 3
  25. #define B_QUIT 4
  26. #define CS (cf->sequence)
  27. #define PS (cf->prev_sequence)
  28. #define RS (cf->read_sequence)
  29.  
  30. #define CSfirst (sequence_first(CS))
  31. #define CSlast (sequence_last(CS))
  32. #define CSinverted (sequence_inverted(CS))
  33. #define PSfirst (sequence_first(PS))
  34. #define PSlast (sequence_last(PS))
  35. #define PSinverted (sequence_inverted(PS))
  36. #define RSfirst (sequence_first(RS))
  37. #define RSlast (sequence_last(RS))
  38. #define RSinverted (sequence_inverted(RS))
  39.  
  40. int browse_direction = B_FORWARD;
  41.  
  42. struct browse_cmds {
  43.     char cmd;
  44.     int (*fctn)();
  45.     char *hlpstr;
  46. } browse_cmds[] = {
  47.     { ' ', browse_body,     "see the next message" },
  48.     { 'n', browse_next,        "go to next message" },
  49.     { 'p', browse_prev,        "go to previous message" },
  50.     { 'q', browse_quit,        "quit browsing" },
  51.     { 's', browse_switch,    "switch direction of browsing" },
  52.     { '?', browse_help,        "print this out" },
  53.     { '\f', browse_header,    "redisplay the header" },
  54.     { '\n', browse_body,    "see the message" },
  55.     { 'c', browse_copy,        "copy to a file" },
  56.     { 'r', browse_reply,    "reply to the message" },
  57.     { 'd', browse_delete,    "delete this message" },
  58.     { 'f', browse_flag,        "flag this message" },
  59.     { 'k', browse_keyword,    "add a keyword to this message" },
  60.     { '\0', nil, nil },
  61. };
  62.  
  63. cmd_browse(n) 
  64. int n;
  65. {
  66.     int omode;
  67.  
  68.     if (!check_cf (O_RDWR))
  69.     return;
  70.  
  71.     omode = mode;
  72.     if (!(mode & MM_READ)) {
  73.     parse_sequence ("unseen", NULL, NULL);
  74.     copy_sequence (cf->read_sequence, cf->sequence); /* XXX */
  75.     check_mark();            /* can we mark things? */
  76.     
  77.     if (sequence_start (cf->read_sequence)) {
  78.         mode |= MM_BROWSE;
  79.     }
  80.     }
  81.     else {
  82.     confirm();
  83.     mode |= MM_BROWSE;
  84.     }
  85. }
  86.  
  87. browse_message()
  88. {
  89.     int c;
  90.  
  91.     browse_header();
  92.     c = browse_getchar();
  93.     return(browse_dispatch(c));
  94. }
  95.  
  96. browse_header() {
  97.     message *m = &cf->msgs[cf->current];
  98.     char *htext(), *from = htext("from", m->text);
  99.     char *date = hdate(m->date);
  100.     char *subj = htext("subject",m->text);
  101.  
  102.     if (browse_clear_screen == SET_YES)
  103.     cmcls();            /* clear the screen */
  104.     else
  105.     printf("\n");
  106.  
  107.     header_summary (cf->current, stdout, 1); /* 1 => browse format */
  108.  
  109.     printf("--%d chars;  More?--", m->size);
  110.     safe_free(from);
  111.     safe_free(subj);
  112.     return(B_STAY);
  113. }
  114.  
  115. browse_body() 
  116. {
  117.     if (clear_screen)            /* user normally want this? */
  118.     cmcls();
  119.     else
  120.     printf("\n");
  121.  
  122.     if (!display_message(stdout, &cf->msgs[cf->current], false,
  123.              only_type_headers, dont_type_headers) ||
  124.     browse_pause == SET_YES)
  125.     {
  126.     if (browse_clear_screen == SET_YES) {
  127.         printf("---Hit any key to continue---");
  128.         browse_getchar();
  129.     }
  130.     }
  131.     change_flag(cf->current, CMD_MARK);
  132.     return(B_FORWARD);
  133. }
  134.  
  135. browse_next() 
  136. {
  137.     return(B_FORWARD);
  138. }
  139.  
  140. browse_prev()
  141. {
  142.     return(B_BACKWARD);
  143. }
  144.  
  145. browse_switch()
  146. {
  147.     sequence_inverted(CS) = !sequence_inverted(CS);
  148.     return(B_FORWARD);
  149. }
  150.  
  151. browse_quit()
  152. {
  153.     cmxputc('\n');
  154.     return(B_QUIT);
  155. }
  156.  
  157. browse_help()
  158. {
  159.     int i;
  160.     printf("\n");
  161.     for(i = 0; browse_cmds[i].fctn != nil; i++) {
  162.     if (browse_cmds[i].cmd < ' ' || browse_cmds[i].cmd == '\177')
  163.         printf("'^%c'", browse_cmds[i].cmd ^ 0100);
  164.     else
  165.         printf(" '%c'", browse_cmds[i].cmd);
  166.     printf(" -- %s\n", browse_cmds[i].hlpstr);
  167.     }
  168.  
  169.     if (browse_clear_screen == SET_YES) {
  170.     printf("---Hit any key to continue---");
  171.     browse_getchar();
  172.     }
  173.     return(B_STAY);
  174. }
  175.  
  176. browse_dispatch(c) {
  177.     int ret = -1;
  178.     int r,i;
  179.     for(i = 0; browse_cmds[i].fctn != nil; i++)
  180.     if (browse_cmds[i].cmd == c) {
  181.         ret = (*browse_cmds[i].fctn)();
  182.         break;
  183.     }
  184.     switch(ret) {
  185.     case B_STAY:
  186.     break;
  187.     case B_FORWARD:
  188.     if (sequence_next(CS) == 0)
  189.         mode &= ~MM_BROWSE;
  190.     break;
  191.     case B_BACKWARD:
  192.     sequence_inverted(CS) = !sequence_inverted(CS);
  193.     r = sequence_next(CS);
  194.     sequence_inverted(CS) = !sequence_inverted(CS);
  195.     if (r == 0)
  196.         mode &= ~MM_BROWSE;
  197.     break;
  198.     case B_QUIT:
  199.     mode &= ~MM_BROWSE;
  200.     break;
  201.     default:
  202.     fflush(cmcsb._cmoj);
  203.     fprintf(stderr,"\n\007Invalid command\n");
  204.     printf("--%d chars;  More?--", cf->msgs[cf->current].size);    
  205.     return(browse_dispatch(browse_getchar()));
  206.     }
  207. }
  208.  
  209. browse_copy() 
  210. {
  211.     int doprev = false;
  212.  
  213.     cmseteof();
  214.     if (cmseter ()) {            /* errors return here */
  215.     if (cmcsb._cmerr == CMxEOF) {
  216.         return CMxEOF;
  217.     }
  218.     else
  219.         doprev = true;
  220.     }
  221.     
  222.     prompt("Copy to: ");
  223.     if (doprev) {
  224.     doprev = false;
  225.     prevcmd();
  226.     }
  227.     cmsetrp();
  228.     cmd_copy(CMD_COPY, false);
  229.     return(B_FORWARD);
  230. }
  231.  
  232. browse_reply() 
  233. {
  234.     cmxnl();
  235.     do_reply(cf->current, reply_all, reply_include_me);
  236.     return(B_FORWARD);
  237. }
  238.  
  239. int
  240. browse_getchar()
  241. {
  242.     int c = getchar();
  243.     cmechx(c);
  244.     return(c);
  245. }
  246.  
  247. browse_delete()
  248. {
  249.     check_mark();
  250.     change_flag(cf->current, CMD_DELETE);
  251.     return(B_FORWARD);
  252. }
  253.  
  254. browse_flag()
  255. {
  256.     check_mark();
  257.     change_flag(cf->current, CMD_FLAG);
  258.     return(B_STAY);
  259. }
  260.  
  261. browse_keyword() {
  262.     int doprev = false;
  263.  
  264.     check_mark();
  265.     cmseteof();
  266.     if (cmseter ()) {            /* errors return here */
  267.     if (cmcsb._cmerr == CMxEOF) {
  268.         return CMxEOF;
  269.     }
  270.     else
  271.         doprev = true;
  272.     }
  273.     
  274.     prompt("Keyword: ");
  275.     if (doprev) {
  276.     doprev = false;
  277.     prevcmd();
  278.     }
  279.     cmsetrp();
  280.     do_keyword();
  281.     return(B_STAY);
  282. }
  283.